using System;

namespace GenericsExample // 命名空间
{
    // 定义一个泛型接口
    public interface IRepository<T>
    {
        void Add(T item);
        T Get(int index);
    }

    // 实现泛型接口的泛型类
    public class Repository<T> : IRepository<T>
    {
        private readonly List<T> _items = new List<T>();

        public void Add(T item)
        {
            _items.Add(item);
            Console.WriteLine($"{typeof(T).Name} added.");
        }

        public T Get(int index)
        {
            if (index < 0 || index >= _items.Count)
            {
                throw new IndexOutOfRangeException("Index is out of range.");
            }
            return _items[index];
        }
    }

    // 定义一个泛型类，具有约束
    public class GenericCalculator<T> where T : struct // 约束 T 为值类型
    {
        public T Add(T a, T b)
        {
            dynamic x = a; // 动态类型用于支持加法
            dynamic y = b;
            return x + y;
        }
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            // 使用泛型类和接口
            IRepository<string> stringRepository = new Repository<string>();
            stringRepository.Add("Hello");
            stringRepository.Add("World");
            Console.WriteLine(stringRepository.Get(0)); // 输出: Hello

            IRepository<int> intRepository = new Repository<int>();
            intRepository.Add(10);
            intRepository.Add(20);
            Console.WriteLine(intRepository.Get(1)); // 输出: 20

            // 使用泛型方法
            var calculator = new GenericCalculator<int>();
            int sum = calculator.Add(5, 10);
            Console.WriteLine($"Sum: {sum}"); // 输出: Sum: 15
        }
    }
}
